Backup register (BKP) suport (bkp.h)
バックアップ・レジスタの利用
概要(*1)
バックアップ・レジスタ(BKP)は、84バイトのユーザーアプリケーションのデータを保存することが可能な最大42個の16ビットレジスタで構成されています。これらのレジスタはVBATにより電源を維持するバックアップ・ドメインに搭載されています。これらのレジスタは、デバイスがSTANDBYからウェークアップした場合や、システム・リセットまたは電源リセットされてもリセットされません。
更に、BKP制御レジスタはタンパ検出機能やRTC周波数調整にも利用されます。
主な機能(*1)
20バイトのバックアップ・データ・レジスタ(中容量デバイス:フラッシュメモリ128kバイト迄)あるいは84バイトのバックアップ・データ・レジスタ(大容量デバイス)
割込みによるタンパ検出管理のためのバックアップ制御/ステータス・レジスタ
RTC周波数の調整値を格納するRTCクロック校正レジスタ
RTC校正クロック、RTCアラームパルス、もしくはタンパピンPC13の2つ目のパルス(このピンがタンパ検出に使われていない場合)の出力
データ型
■ struct bkp_dev
バックアップペリフェラル(周辺機器)型
パブリックメンバー
bkp_reg_map * regs :BKPレジスタ型変数へのアドレス
■ struct bkp_reg_map
バックアップペリフェラル(周辺機器)レジスタマップ型
パブリックメンバー
※メモリが中容量のSTM32F103C8T6(Blue Pillボードなど)は、
バックアップ・データ・レジスタは20バイト分(Dataレジスタ1~10)までが利用可能です。
const uint32 RESERVED1 リザーブ
__io uint32 DR1 バックアップ・データ・レジスタ 1
__io uint32 DR2 バックアップ・データ・レジスタ 2
__io uint32 DR3 バックアップ・データ・レジスタ 3
__io uint32 DR4 バックアップ・データ・レジスタ 4
__io uint32 DR5 バックアップ・データ・レジスタ 5
__io uint32 DR6 バックアップ・データ・レジスタ 6
__io uint32 DR7 バックアップ・データ・レジスタ 7
__io uint32 DR8 バックアップ・データ・レジスタ 8
__io uint32 DR9 バックアップ・データ・レジスタ 9
__io uint32 DR10 バックアップ・データ・レジスタ 10
__io uint32 RTCCR RTCクロック校正レジスタ
__io uint32 CR バックアップ制御レジスタ
__io uint32 CSR バックアップ制御/ステータス・レジスタ
const uint32 RESERVED2 リザーブ
const uint32 RESERVED3 リザーブ
__io uint32 DR11 バックアップ・データ・レジスタ 11
__io uint32 DR12 バックアップ・データ・レジスタ 12
__io uint32 DR13 バックアップ・データ・レジスタ 13
__io uint32 DR14 バックアップ・データ・レジスタ 14
__io uint32 DR15 バックアップ・データ・レジスタ 15
__io uint32 DR16 バックアップ・データ・レジスタ 16
__io uint32 DR17 バックアップ・データ・レジスタ 17
__io uint32 DR18 バックアップ・データ・レジスタ 18
__io uint32 DR19 バックアップ・データ・レジスタ 19
__io uint32 DR20 バックアップ・データ・レジスタ 20
__io uint32 DR21 バックアップ・データ・レジスタ 21
__io uint32 DR22 バックアップ・データ・レジスタ 22
__io uint32 DR23 バックアップ・データ・レジスタ 23
__io uint32 DR24 バックアップ・データ・レジスタ 24
__io uint32 DR25 バックアップ・データ・レジスタ 25
__io uint32 DR26 バックアップ・データ・レジスタ 26
__io uint32 DR27 バックアップ・データ・レジスタ 27
__io uint32 DR28 バックアップ・データ・レジスタ 28
__io uint32 DR29 バックアップ・データ・レジスタ 29
__io uint32 DR30 バックアップ・データ・レジスタ 30
__io uint32 DR31 バックアップ・データ・レジスタ 31
__io uint32 DR32 バックアップ・データ・レジスタ 32
__io uint32 DR33 バックアップ・データ・レジスタ 33
__io uint32 DR34 バックアップ・データ・レジスタ 34
__io uint32 DR35 バックアップ・データ・レジスタ 35
__io uint32 DR36 バックアップ・データ・レジスタ 36
__io uint32 DR37 バックアップ・データ・レジスタ 37
__io uint32 DR38 バックアップ・データ・レジスタ 38
__io uint32 DR39 バックアップ・データ・レジスタ 39
__io uint32 DR40 バックアップ・データ・レジスタ 40
__io uint32 DR41 バックアップ・データ・レジスタ 41
__io uint32 DR42 バックアップ・データ・レジスタ 42
バックアップ・データ・レジスタは任意のユーザデータを書き込むことが出来ます。
デバイス
■ const bkp_dev * BKP
BKP(バックアップ)デバイス(デバイス操作情報)
API関数
■ void bkp_init(void)
バックアップインターフェイスを初期化します。
電源およびバックアップのインターフェイスクロックをイネーブルにし、バックアップデバイスをリセットします。
■ void bkp_enable_writes(void)
バックアップ・レジスタへの書き込みアクセスを可能にします。
後続のレジスタ書き込みが機能するためには、バックアップインターフェイスを初期化する必要があります。
■ void bkp_disable_writes(void)
バックアップ・レジスタへの書き込みアクセスを無効にします。
■ uint16 bkp_read(uint8 reg)
指定されたバックアップ・データ・レジスタから値を読み出します。
引数
reg:読み込むデータレジスタ、1 ~ BKP_NR_DATA_REGS(中密度デバイスでは10、高密度デバイスでは42)
戻り値
指定したレジスタの値
■ void bkp_write(uint8 reg, uint16 val)
与えられたバックアップ・データ・レジスタに値を書き込みます。
バックアップ・データ・レジスタへの書き込みアクセスを有効にする必要があります。
引数
reg:書き込むデータレジスタ、1 ~ BKP_NR_DATA_REGS(中密度デバイスでは10、高密度デバイスでは42)
var:書き込む値
レジスタマップベースポインタ
■ BKP_BASE
バックアップペリフェラル(周辺機器)レジスタマップのベースポインタ(アドレス)
レジスタのビット定義
バックアップ・データ・レジスタ
■BKP_DR_D [15-0] 16ビット(rw)
RTCクロック校正レジスタ(RTC Clock Calibration Register)
ビット番号
■ BKP_RTCCR_ASOS_BIT [9] 1ビット(rw) :アラームまたはセカンド出力選択
■ BKP_RTCCR_ASOE_BIT [8] 1ビット(rw) :アラームまたはセカンド出力イネーブル
■ BKP_RTCCR_CCO_BIT [9] 1ビット(rw) :校正クロック出力
ビットセット
■ BKP_RTCCR_ASOS BIT(BKP_RTCCR_ASOS_BIT)
■ BKP_RTCCR_ASOE BIT(BKP_RTCCR_ASOE_BIT)
■ BKP_RTCCR_CCO BIT(BKP_RTCCR_CCO_BIT)
■ BKP_RTCCR_CAL 0x7F [6:0] 7ビット(rw) 校正値:2^20クロック x CAL (0~121ppm)
バックアップ制御レジスタ(Backup control register)
ビット番号
■ BKP_CR_TPAL_BIT [1] 1ビット(rw) :タンパ・ピン・アクティブ・レベル
■ BKP_CR_TPE_BIT [0] 1ビット(rw) :タンパ・ピン・イネーブル
ビットセット
■ BKP_CR_TPAL BIT(BKP_CR_TPAL_BIT)
■ BKP_CR_TPE BIT(BKP_CR_TPE_BIT)
バックアップ制御/ステータス・レジスタ(Backup control/status register)
ビット番号
■ BKP_CSR_TIF_BIT [9] 1ビット(r) :タンパ割込みリクエスト・フラグ
■ BKP_CSR_TEF_BIT [8] 1ビット(r) :タンパ・イベント・フラグ
■ BKP_CSR_TPIE_BIT [2] 1ビット(rw) :タンパ・ピン割り込みリクエスト許可
■ BKP_CSR_CTI_BIT [1] 1ビット(w) :タンパ割込みリクエスト・クリア
■ BKP_CSR_CTE_BIT [0] 1ビット(w) :タンパ・イベント・クリア
ビットセット
■ BKP_CSR_TIF BIT(BKP_CSR_TIF_BIT)
■ BKP_CSR_TEF BIT(BKP_CSR_TEF_BIT)
■ BKP_CSR_TPIE BIT(BKP_CSR_TPIE_BIT)
■ BKP_CSR_CTI BIT(BKP_CSR_CTI_BIT)
■ BKP_CSR_CTE BIT(BKP_CSR_CTE_BIT)
利用例
バックアップドメインのメモリを読み書きするサンプルプログラム
code:stm32_BKP_exsample.ino
//
// stm32_BKP_exsample.ino (for Arduino STM32)
// BKP利用サンプルプログラム by たま吉さん
// バックアップドメインのメモリ10ワード(20バイト)を利用するデモです.
// バックアップドメインのメモリの性質
// 1)リセットしてもデータは保持される
// 2)さらにバッテリーバックアップ有りの場合、電源OFFでのデータが保持される
//
void setup() {
Serial.begin(115200);
while (!Serial.isConnected())
delay(100);
bkp_init(); // BKPの初期化
Serial.println("Menu 1:Write 2:Read"); }
void loop() {
uint8_t InputChar;
if (Serial. available()) {
switch(Serial.read()) {
case '1':
Serial.println("Write data.");
bkp_enable_writes(); // 書込み可能にする
for (uint16_t reg=1; reg <= BKP_NR_DATA_REGS; reg++) {
bkp_write(reg, reg-1); // データの書込み
Serial.print("DR");
Serial.print(reg,DEC);
Serial.print("=");
Serial.println(reg-1,DEC);
}
bkp_disable_writes(); // 書込み禁止にする
break;
case '2':
Serial.println("Read data.");
for (uint16_t reg=1; reg <= BKP_NR_DATA_REGS; reg++) {
Serial.print("DR");
Serial.print(reg,DEC);
Serial.print("=");
Serial.println(bkp_read(reg),DEC); // データの読み込み
}
break;
}
}
}
スケッチを起動し、シリアルコンソール上にてキーボードから、'1'(書き込み)、'2'(読み込み)を入力します。
リセットボタンを押してもデータが保持されていることを確認して下さい。
また、バッテリーバックアップを行った場合は、電源を切ってもデータが保持されていることを確認して下さい。
ボタン電池によるバッテリーバックアップ回路の例:
https://gyazo.com/cd5f3e9f727806f6a914ef897ccb7a46
脚注
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。
NAVER、ヤフオク等の営利目的の記事転用、リンク貼りは禁止です。